package pruebas;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintStream;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;

import juego.Coordenada;
import junit.framework.TestCase;

public class TestCoordenada extends TestCase {
	
	public void testMover(){
		Coordenada coordenada = new Coordenada(0,0);
		coordenada.moverEnX(10);
		coordenada.moverEnY(15);
		assertEquals(10,coordenada.obtenerCoordenadaX());
		assertEquals(15,coordenada.obtenerCoordenadaY());
		coordenada.moverEnXY(-5,7);
		assertEquals(5,coordenada.obtenerCoordenadaX());
		assertEquals(22,coordenada.obtenerCoordenadaY());
	}
	
	public void testDistancia(){
		Coordenada coordenada = new Coordenada(0,0);
		Coordenada otraCoordenada = new Coordenada (3,4);
		assertEquals(5,coordenada.distancia(otraCoordenada));
		assertEquals(5,otraCoordenada.distancia(coordenada));
	}
	
	public void testModulo(){
		Coordenada coordenada = new Coordenada (3,4);
		double modulo = coordenada.getModulo();
		assertEquals(5.0,modulo);
	}
	
	public void testNormalizar(){
		Coordenada coordenada = new Coordenada (3,4);
		coordenada.normalizar();
		assertEquals(1,coordenada.obtenerCoordenadaX());
		assertEquals(1,coordenada.obtenerCoordenadaY());
		
		Coordenada coordenada2 = new Coordenada (6,8);
		coordenada2.normalizar();
		assertEquals(1,coordenada2.obtenerCoordenadaX());
		assertEquals(1,coordenada2.obtenerCoordenadaY());
		
		Coordenada coordenada3 = new Coordenada (10,0);
		coordenada3.normalizar();
		assertEquals(1,coordenada3.obtenerCoordenadaX());
		assertEquals(0,coordenada3.obtenerCoordenadaY());
		
		Coordenada coordenada4 = new Coordenada (0,0);
		coordenada4.normalizar();
		assertEquals(0,coordenada4.obtenerCoordenadaX());
		assertEquals(0,coordenada4.obtenerCoordenadaY());
		
		Coordenada coordenada5 = new Coordenada (0,10);
		coordenada5.normalizar();
		assertEquals(0,coordenada5.obtenerCoordenadaX());
		assertEquals(1,coordenada5.obtenerCoordenadaY());
		
		Coordenada coordenada6 = new Coordenada (2,8);
		coordenada6.normalizar();
		assertEquals(0,coordenada6.obtenerCoordenadaX());
		assertEquals(1,coordenada6.obtenerCoordenadaY());
		
		Coordenada coordenada7 = new Coordenada (-10,0);
		coordenada7.normalizar();
		assertEquals(-1,coordenada7.obtenerCoordenadaX());
		assertEquals(0,coordenada7.obtenerCoordenadaY());
		
		Coordenada coordenada8 = new Coordenada (3,-4);
		coordenada8.normalizar();
		assertEquals(1,coordenada8.obtenerCoordenadaX());
		assertEquals(-1,coordenada8.obtenerCoordenadaY());
	}
	
	
	private static void persistir(String archivo, Coordenada coordenada) {
				
		try {

			Document doc = DocumentBuilderFactory.newInstance()
					.newDocumentBuilder().newDocument();

			Element element = coordenada.getElement(doc);
			doc.appendChild(element);

			Transformer transformer = TransformerFactory.newInstance()
					.newTransformer();
			transformer.setOutputProperty(OutputKeys.INDENT, "yes");
			transformer.transform(new DOMSource(doc), new StreamResult(
					new PrintStream(archivo)));

		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (TransformerConfigurationException e) {
			e.printStackTrace();
		} catch (TransformerFactoryConfigurationError e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (TransformerException e) {
			e.printStackTrace();
		}
	}
	
	private static Coordenada recuperar(String archivo) {
		try {
			
			Document doc = DocumentBuilderFactory.newInstance()
					.newDocumentBuilder().parse(new File(archivo));
			Element element = doc.getDocumentElement();

			Coordenada coordenada = Coordenada.fromElement(element);
			return coordenada;			
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		}
		
		return null;
	}
	
	public void testPersistencia() {

		String archivo = "coordenada_java.xml";
		Coordenada coordenadaOriginal = new Coordenada(10,15);
		persistir(archivo, coordenadaOriginal);
		Coordenada coordenadaRecuperada = recuperar(archivo);
		assertEquals(10,coordenadaRecuperada.obtenerCoordenadaX());
		assertEquals(15,coordenadaRecuperada.obtenerCoordenadaY());
	}


}
